Описание проекта

Чтобы оптимизировать производственные расходы необходимо построить прототип модели, которая предскажет температуру стали в процессе легирования стали.

Сталь обрабатывают в металлическом ковше вместимостью около 100 тонн. Чтобы ковш выдерживал высокие температуры, изнутри его облицовывают огнеупорным кирпичом. Расплавленную сталь заливают в ковш и подогревают до нужной температуры графитовыми электродами. Они установлены в крышке ковша.

Из сплава выводится сера (десульфурация), добавлением примесей корректируется химический состав и отбираются пробы. Сталь легируют — изменяют её состав — подавая куски сплава из бункера для сыпучих материалов или проволоку через специальный трайб-аппарат (англ. tribe, «масса»).

Перед тем как первый раз ввести легирующие добавки, измеряют температуру стали и производят её химический анализ. Потом температуру на несколько минут повышают, добавляют легирующие материалы и продувают сплав инертным газом. Затем его перемешивают и снова проводят измерения. Такой цикл повторяется до достижения целевого химического состава и оптимальной температуры плавки.

Содержание проекта кликабельное

Содержания проекта

1. Подготовка данных
   1.1 Загрузка данных
   1.2 Анализ целевой переменной
   1.3 Анализ данных в таблице data_arc
   1.4 Анализ данных в таблице data_gas
   1.5 Анализ данных в таблице data_bulk
   1.6 Анализ данных в таблице data_wire
2. Обучение модели
   2.1 Подготовка данных для обучения
     2.1.1 Анализ временных меток в таблицах data_temp и data_arc
     2.1.2 Подготовка данных в таблице data_temp
     2.1.3 Подготовка данных в таблице data_arc
     2.1.4 Объединение данных
   2.2 Разделение данных на обучение и тест
   2.3 Линейная регрессия
   2.4 LightGBM
   2.5 CatBoostRegressor
   2.6 Важность признаков
   2.7 Матрица корреляции и анализ на мультиколинеарность признаков
   2.8 Анализ моделей
3. Отчет по проекту

Импорт необходимых библиотек

Блок вспомогательных функций

1. Подготовка данных

1.1 Загрузка данных

1.2 Анализ целевой переменной

Удалим записи, в которых нет целевой переменной

Проанализируем распределение температур в данных

Проанализируем длинный левый хвост. Для этого отберём данные с температурой меньше 1450 градусов (википедия говорит, что это нижняя температура плавления для стали), посмотрим сколько партий в процессе выплавки имели такую температуру. Для "подозрительных" партий усредним температуру и проверим превышает ли средняя температура 1450. Если средняя температура меньше 1450 - это явный выброс, удалим такие данные.

Вывод:
В таблице с целевой переменной удалили пропуски. Проанализировали распределение температуры в данных. Выявили один выброс для партии с key=2561. Общее число партий для дальнейшего анализа = 3215. Типы данных правильные.

1.3 Анализ данных в таблице data_arc

Дополнительно исследуем реактивную мощность, т.к. видим на гистограмме отрицательные значение.

Исправим отрицательное значение на медиану

Вывод:
Пропусков в таблице нет. Найдено одно отрицательное значение в реактивной мощности в партии №2116, произвели замену на медианное значение. Типы данных правильные.

1.4 Анализ данных в таблице data_gas

Вывод:
Пропусков в таблице нет. Предобработка не требуется. Тип данных правильный.

1.5 Анализ данных в таблице data_bulk

Вывод:
Пропуски в таблице вероятно обусловлены тем, что данная легирующая добавка не добавляется в текущий сплав. Пропуски заполним нулями, при обучении линейной регрессии, для бустинга оставим как есть. Типы данных правильные.

1.6 Анализ признака в таблице data_wire

Вывод:
Пропуски в таблице вероятно обусловлены тем, что данная легирующая добавка не добавляется в текущий сплав. Пропуски заполним нулями, при обучении линейной регрессии, для бустинга оставим как есть. Типы данных правильные.

Из любопытства посмотрим как распределены данные в наиболее популярных добавках, вроде ничего не обычного.

2. Обучение моделей

2.1 Подготовка данных для обучения

Необходимо объединить данные из разных таблиц, в следующую таблицу:

Данные таблиц data_bulk_time и data_wire_time игнорируем

2.1.1 Анализ временных меток в таблицах data_temp и data_arc

Объединим две таблицы, чтобы получить целевую переменную и первое измерение температуры

Проверим, когда производились измерения температуры в партиях, у которых было только одно измерение температуры.

Найдем партии, в которых последнее измерение температуры было ДО выключения электродов, т.е. партии, в которых нет целевой переменной

Теперь проверим, а что же с первым измерением температуры, которое по условию задачи, должно проводиться до первого включения электродов

Выводы:

Фиксируем следующие проблемы в данных, выявленные при анализе временных меток:

  1. В таблице data_temp 740 записей с одним измерением температуры для партии, из них только у 7 партий температура измерялась после последнего выключения электродов. Остальные измерения проведены либо в промежутках между итерациями, либо до начала нагрева.
  2. Также в данных обнаружились партии (862 штуки), в которых время последнего измерения температуры (целевая) меньше времени последнего выключения электрода, т.е. это не целевая переменная.
  3. Практически у всех партий (3126) время первого измерения температуры больше времени первого включения электродов.

Возможно есть проблемы со сбором данных, в части измерения температуры и/или временных меток.

По согласованию с тимлидом, были приняты следующие решения:

  1. Партии с одним измерением температуры - выбрасываем.
  2. Будем игнорировать привязки ко времени измерения температуры и включения электродов. Считаем первое измерение - первым, а последнее - последним. Без учета времени включения электродов.

2.1.2 Подготовка данных в таблице data_temp

По согласованию с тимлидиом удалим партии, в которых только одно измерение температуры

Добавим интервал времени в секундах между измерениями и удалим лишние колонки

2.1.3 Подготовка данных в таблице data_arc

2.1.4 Объединение данных

Главная таблица data_temp_group - к ней левым соединением добавляем остальные таблицы, по ключу key. Итоговое число строк не должно превышать количество строк в таблице data_temp_group

Вывод:

Мы подготовили датасет к обучению, сгенерировали новые признаки добавив статистики: min, max, sum, median, count. В дальнешем, для каждого класса моделей машинного обучения немного дообработаем данные (выполним нормировка, работу с пропусками).

2.2 Разделение данных на обучение и тест

2.3 Линейная регрессия

Обучение проведем через RandomizedSearchCV на 10 фолдах, в качестве гиперпараметра выступит alpha - коэффициент регуляризации

Вывод:

Модель линейной регрессии показывает удовлетворительный результат по метрике МАЕ (согласно условиям задачи). Благодаря подобронному коэффициенту alpha переобучение не наблюдается. Модель учится очень быстро, поэтому мы можем ее переобучать перед каждым запуском на предсказание, это является плюсом данной модели.

2.4 LGBMRegressor

Попробуем подобрать гиперпараметры для улучшения метрики

2.5 CatBoostRegressor

Попробуем подобрать гиперпараметры для улучшения метрики

2.6 Важность признаков

2.7 Матрица корреляции и анализ на мультиколинеарность признаков

Т.к. признаков много, разобъем матрицу корреляции на показатели тех.процесса и лигирующие материалы

Проанализируем корреляции между признаками. Корреляции между лигирующими добавками, анализировать не будем, т.к. не зная их химический состав сложно делать предположения о природе корреляции. А вот корреляции между физическими параметрами процесса, можно отобрать и попробовать перестроить модель удалив "лишнние" - сильно коррелированные признаки.

Переобучим модель CatBoost и посмотрим на результаты

Мы уменьшили переобучение без потери качества метрики! Это позволяет надеятся, что модель будет работать стабильно и на других данных.

2.8 Анализ моделей

В проекте были опробованны три модели машиного обучения:


Анализ признаков у моделей бустингов показал:


Матрица корреляции также подтверждает высокую корреляцию целевой переменной с первым измерением температуры. Кроме этого, можно отметить, что матрица корреляции показывает, как целевая переменная может неплохо коррелировать с другими лигирующими добавками. Текущие модели не выделяют в важные признаки большинство лигирующих добавок, например Wire 4, которые показывают неплохую корреляцию с таргетом (вероятно потому что данных мало). Можно попробовать сгенерировав новые признаки, например добавить признак "Есть Wire 4", для улучшения качества моделей.

С помощью матрицы корреляции мы поборолись с мультиколлениарностью признаков, заметно уменьшив переобучение модели (без потери качества), тем самым повысив стабильность метрики полученной на тесте.


Для дальнейшего развития данной задачи, мы бы рекомендовали модели бустинга (например CatBoost), т.к. их использование показывает хорошую метрику качества, модели интерпретируемые, а так же у них есть потенциал улучшения.

3 Отчет по проекту

В процессе работы над проектом мы столкнулись со следющими проблемами, не входящие в первоначальный план:

В процессе работы над проектом были решены следующие задачи: